信息流广告
简介
信息流广告分为自渲染广告和模板广告,但是模板广告只有当三方SDK支持时才会返回模板广告。SDK 提供信息流广告的数据绑定、点击事件的上报。
①自渲染广告:聚合SDK返回物料,由开发者在返回的CloooudMCanvasView类型的canvasView上进行子视图的自行渲染和展示。
②模板广告:聚合SDK直接返回渲染好的广告CloooudMCanvasView,开发者直接展示即可。
注意事项
①需要确保在SDK初始化成功后再进行广告请求,否则可能导致广告请求加载失败。
②聚合维度广告是通过广告位ID发起广告请求的,切记不要使用混淆。
③在广告接入前需要明确各ADN对应聚合广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生。
④广告加载数量以平台配置数量为准,本地数量仅在平台配置为0时有效,目前本地配置支持的广告数量为 1 ~ 3。
⑤由于各广告平台对于包名校验规则不同,需确保在穿山甲媒体平台填写的包名符合各adn平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生。
⑥视频播放是否静音通过设置mutedIfCan接口即可,默认为NO,支持的ADN有admob/baidu/GDT/Mintergral/Sigmob;如若设置首次预加载功能,请检查静音接口设置是否与项目实际情况相符,默认为NO。
⑦一定要设置rootViewController,即跳转落地页需要的viewController。
⑧在物料加载成功方法里获取相关广告信息赋值后,需调用 registerContainer:withClickableViews:clickableViews注册绑定点击的View并刷新数据源refreshData:。
⑨每次获取物料信息后需要刷新调用refreshData:方法
接入信息流广告
// 创建广告对象
- (void)p_buildAd {
CloooudAdSlot *slot1 = [[CloooudAdSlot alloc] init];
CloooudSize *imgSize1 = [[CloooudSize alloc] init];
imgSize1.width = 1080;
imgSize1.height = 1920; // 按照实际情况设置宽高
slot1.imgSize = imgSize1;
slot1.ID = Cloooud_feed_ID; // 聚合维度通过广告位ID发起请求,
// 聚合维度:如果是模板广告,返回高度将不一定是300,而是按照414和对应代码位在平台的配置计算出的高度
slot1.adSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 400);
slot1.mediation.mutedIfCan = YES; // 是否使用聚合功能
self.adManager = [[CloooudNativeAdsManager alloc] initWithSlot:slot1];
self.adManager.mediation.rootViewController = self;
self.adManager.delegate = self;
}
// 触发广告加载
- (void)p_loadAdData {
[self.adManager loadAdDataWithCount:3]; // 加载广告数量,支持设置1-3个
}
// 收到load成功回调后展示
# pragma mark ---<CloooudMNativeAdsManagerDelegate>---
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray{
for (CloooudNativeAd *model in nativeAdDataArray) {
NSUInteger index = rand() % (self.dataSource.count - 3) + 2;
model.rootViewController = self;
model.delegate = self;
if (model.mediation.isExpressAd) {
[model.mediation render];
}
[self.dataSource insertObject:model atIndex:index];
}
[self.tableView reloadData];
}
获取展示后广告信息示例
在收到加载成功回调后访问可获取到正确信息
- (void)logAdInfoAfterShow {
CloooudMRitInfo *info = [self.adManager.mediation getShowEcpmInfo];
// 展示后可获取信息如下
NSLog(@"ecpm:%@", info.ecpm); // 单位:分
NSLog(@"platform:%@", info.adnName);
NSLog(@"ritID:%@", info.slotID);
NSLog(@"requestID:%@", info.requestID ?: @"None");
NSLog(@"getAdLoadInfoList:%@", [self.adManager.mediation getAdLoadInfoList]);
}
接口及回调说明
在SDK里只需要使用 CloooudNativeAdsManager 就可以获取信息流广告。CloooudNativeAdsManager支持多广告加载,可以一次加载返回多个广告,并且支持模版渲染和自渲染混出。
CloooudNativeAdsManager说明
方法 | 说明 |
---|---|
@property (nonatomic, strong, nullable) CloooudAdSlot *adslot; | 广告配置对象 |
@property (nonatomic, strong, nullable) NSArray<CloooudNativeAd > data; | |
@property (nonatomic, weak, nullable) id |
信息流广告协议,聚合维度使用CloooudMNativeAdsManagerDelegate |
@property (nonatomic, weak, nullable) id |
信息流广告视图协议 |
@property (nonatomic, assign, readwrite) CGSize adSize; | 广告尺寸设置 |
- (void)loadAdDataWithCount:(NSInteger)count; | 广告请求数量 |
@property (nonatomic, strong, nullable, readonly) CloooudNativeAdsManagerMediation *mediation; | 当使用聚合广告位时,存在该属性,可获取聚合维度相关功能 |
CloooudNativeAdsManagerMediationProtocol说明
方法 | 说明 |
---|---|
@property (nonatomic, weak) UIViewController *rootViewController; | 必要,设置广告详情跳转控制器 |
- (void)destory;不再使用加载成功后回调的视图对象组时,可调用该方法释放占用的内存 | |
@property (nonatomic, assign, readonly) BOOL isLoading; | 广告是否加载中 |
- (void)addParam:(id)param withKey:(NSString *)key; | 添加参数 param 参数值 key 参数key |
- (NSArray<CloooudMAdLoadInfo > )getAdLoadInfoList; | 一次waterfall中各adn代码位加载广告失败原因,建议调用时机:展示广告时/超时时/全部返回报错时;返回nil表示一次加载无代码位加载失败或其加载无响应 |
CloooudNativeAdsManagerDelegate说明
方法 | 说明 |
---|---|
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager )adsManager nativeAds:(NSArray<CloooudNativeAd > *_Nullable)nativeAdDataArray; | 加载成功回调 |
- (void)nativeAdsManager:(CloooudNativeAdsManager )adsManager didFailWithError:(NSError _Nullable)error; | 加载失败回调 |
CloooudNativeAd说明
将CloooudMCanvasView添加到父视图上进行展示。目前仅支持frame布局方式,不支持自动布局。
| 方法 | 说明 |
| --- | --- |
|@property (nonatomic, strong, readwrite, nullable) CloooudAdSlot adslot;|广告配置对象|
|@property (atomic, strong, readonly, nullable) CloooudMaterialMeta data;|广告物料|
|@property (nonatomic, weak, readwrite, nullable) id
CloooudNativeAdMediationProtocol说明
方法 | 说明 |
---|---|
@property (nonatomic, assign, readonly) BOOL isExpressAd; | 是否是模板广告,由adapter开发者实现 |
@property (nonatomic, strong, readonly, nonnull)CloooudMCanvasView *canvasView; | 如果是模板广告可直接将该视图添加到需要展示的位置,如果是非模板广告可对该视图内部控件进行布局操作 |
@property (nonatomic, strong, readonly) CloooudMVideoAdReporter *videoAdReporter; | 自渲染视频类广告事件上报对象,仅采用自定义视频播放器时需要上报,部分ADN需申请白名单 |
- (void)render; | 必要 渲染模板广告,开发者调用前无需区分是否为模板广告,Cloooud会自行处理 |
- (void)reSizeMediaView; | 更新模板媒体视图大小 |
@property (nonatomic, assign, readonly) BOOL isReady; | 是否已经准备广告展示,理论上在广告加载回调后即为YES,但受一些因素的影响(例如广告失效),可能为NO。建议在广告展示前调用该方法进行是否可以展示 |
- (nullable CloooudMRitInfo *)getShowEcpmInfo; | 返回显示广告对应的披露信息 |
- (CloooudDictionary *_Nullable)extraData; | 广告的扩展信息,可能为nil |
- (NSArray<CloooudMRitInfo > )multiBiddingEcpmInfos; | 填充后可调用,但推荐展示后调用,返回竞价广告的ecpm;当为server bidding ad时访问需要白名单权限; |
- (NSArray<CloooudMRitInfo > )cacheRitList; | 填充后可调用, 返回广告缓存池内所有信息;nil为无权限 |
- (CloooudMRitInfo *)getCurrentBestEcpmInfo; | 填充后可调用,返回当前最佳广告的ecpm;当为server bidding ad时访问需要白名单权限 |
@property (nonatomic, copy, readonly) NSString *adViewID; | 广告视图的唯一标识 |
CloooudMaterialMeta说明
自渲染广告物料信息 | 方法 | 说明 | | --- | --- | |@property (nonatomic, assign) CloooudInteractionType interactionType;|广告支持的交互类型| |@property (nonatomic, strong) NSArray<CloooudImage > imageAry;|图片| |@property (nonatomic, strong) CloooudImage icon;|广告logo| |@property (nonatomic, copy) NSString AdTitle;|广告标题| |@property (nonatomic, copy) NSString AdDescription;|广告描述| |@property (nonatomic, copy) NSString source;|广告源| |@property (nonatomic, copy) NSString buttonText;|创意按钮文本| |@property (nonatomic, assign) CloooudFeedADMode imageMode;|广告样式| |@property (nonatomic, assign) NSInteger score;|评分| |@property (nonatomic, assign) NSInteger commentNum;|评论数| |@property (nonatomic, assign) NSInteger appSize;|app大小| |@property (nonatomic, assign) NSInteger videoDuration;|视频时长| |@property (nonatomic, copy, readonly) NSString videoUrl;|视频url| |@property (nonatomic, assign, readonly) BOOL allowCustomVideoPlayer;|自定义播放器| |@property (nonatomic, copy) NSArray<CloooudDislikeWords > filterWords;|dislike原因| |@property (nonatomic, copy) NSDictionary mediaExt;|配置参数| |@property (nonatomic, copy) NSString ADXName;|adx名称| |@property (nonatomic, strong, nullable, readonly) CloooudMaterialMetaMediation *mediation;|使用聚合广告位时,存在该属性,可获取聚合维度相关功能|
CloooudMaterialMetaMediationProtocol说明
方法 | 说明 |
---|---|
@property (nonatomic, strong, readonly, nullable) CloooudImage *adLogo; | 广告adn的logo,如果logo有宽高,请尽量配置width和height |
@property (nonatomic, assign, readonly) CGFloat videoAspectRatio; | 视频纵横比(width/height),如果没有值或者异常返回0 |
@property (nonatomic, strong, readonly, nullable) NSString *appPrice; | app购买价格,例如'免费',没有则为nil |
@property (nonatomic, copy, readonly, nullable) NSString *advertiser; | 广告商标识,广告商的名称或者链接 |
@property (copy, nonatomic, readonly, nullable) NSString *brandName; | 品牌名称,若广告返回中无品牌名称则为空 |
CloooudMCanvasView说明
控件信息 | 方法 | 说明 | | --- | --- | |@property (nonatomic, strong, readonly, nullable) CloooudMaterialMeta data;|非模板Native广告的物料数据,模板广告时为nil| |@property (nonatomic, assign, readonly) BOOL hasSupportActionBtn;|是否支持自定义事件按钮,如果为YES,开发者可以配置 callToActionBtn 的UI数值,默认为YES| |@property (nonatomic, strong, readonly, nonnull) UILabel titleLabel;|广告标题,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, readonly, nonnull) UILabel descLabel;|广告描述,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, nullable) UIImageView iconImageView;|广告图标,可能不存在,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, readonly, nonnull) UIImageView imageView;|广告大图,需要开发者根据广告物料自己指定展示内容,系统会自动创建,但内容需开发者自行校验| |@property (nonatomic, strong, readonly, nonnull) UIButton callToActionBtn;|广告详情/下载按钮,可能不存在,文案内容需要开发者根据广告物料自己获取| |@property (nonatomic, strong, nullable) UIView advertiserView;|广告商视图,可能不存在,开发者可自行赋值处理| |@property (nonatomic, strong, nullable) UIButton dislikeBtn;|广告关闭按钮,可能不存在,开发者需自行处理响应事件| |@property (nonatomic, strong, nullable) UIView adLogoView;|广告LOGO视图,可能不存在,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, readonly, nullable) UIView mediaView;|媒体视图,即视频广告的视频图层,非视频广告不存在该视图| |- (void)registerClickableViews:(nullable NSArray<UIView > )views;|注册可点击区域,由Cloooud透传数据,是否生效由adapter 和 adn 决定 views 可响应点击操作的视图|
CloooudNativeAdDelegate说明
方法 | 说明 |
---|---|
- (void)nativeAdDidLoad:(CloooudNativeAd *)nativeAd; | 广告加载成功 聚合维度不支持此场景 |
- (void)nativeAdDidLoad:(CloooudNativeAd )nativeAd view:(UIView _Nullable)view; | 广告加载成功 推荐使用该方法 聚合维度不支持此场景 |
- (void)nativeAd:(CloooudNativeAd )nativeAd didFailWithError:(NSError _Nullable)error; | 广告加载失败 |
- (void)nativeAdDidBecomeVisible:(CloooudNativeAd *)nativeAd; | 广告展示 |
- (void)nativeAdDidCloseOtherController:(CloooudNativeAd *)nativeAd interactionType:(CloooudInteractionType)interactionType; | 此方法在另一个控制器关闭时调用。 interactionType:在app中打开appstore或打开网页或查看视频广告详情页面。 |
- (void)nativeAdDidClick:(CloooudNativeAd )nativeAd withView:(UIView _Nullable)view; | 广告点击 |
- (void)nativeAd:(CloooudNativeAd _Nullable)nativeAd dislikeWithReason:(NSArray<CloooudDislikeWords > *_Nullable)filterWords; | dislike原因 |
- (void)nativeAd:(CloooudNativeAd _Nullable)nativeAd adContainerViewDidRemoved:(UIView )adContainerView; | 删除广告视图容器 nativeAd:广告材料 adContainerView:广告视图容器 聚合维度不支持场景。 |
- (void)nativeAdWillPresentFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; | 广告即将展示全屏页面/商店时触发 nativeAd 广告视图 |
完整接入示例
- (void)loadNativeAd {
if (self.adManager) {
// 销毁上次广告对象 聚合维度方法
[self.adManager.mediation destory];
}
CloooudAdSlot *slot = [[CloooudAdSlot alloc] init];
slot.ID = @"广告位ID"; // 聚合维度通过广告位ID发起请求,
slot.adSize = CGSizeMake(375, 150); // 按照实际情况设置广告尺寸
slot.mediation.mutedIfCan = YES; // 静音 (聚合功能)
CloooudNativeAdsManager *adManager = [[CloooudNativeAdsManager alloc] initWithSlot:slot];
adManager.mediation.rootViewController = self;
adManager.delegate = self;
self.adManager = adManager;
[self.adManager loadAdDataWithCount:3]; // 加载广告数量,支持1~3个
}
/******** 信息流广告加载回调处理 *********/
# pragma mark CloooudMNativeAdsManagerDelegate
// 广告加载成功
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray {
for (CloooudNativeAd *model in nativeAdDataArray) {
model.rootViewController = self;
model.delegate = self;
if (model.mediation.isExpressAd) {
[model.mediation render];
} else {
// 开发者需自行渲染广告,渲染到model.mediation.canvasView上
// 可以通过model.data.imageMode判断广告样式(大图/视频/组图...)
// 可以通过model.data.imageAry获取图片数据
// 可以通过model.data.AdTitle获取广告标题
// 详情请查看接入文档
[self customRenderAd:model];
// 仅接入CSJ广告
[self.nativeAdRelatedView refreshData:model];
}
/* (注意: getShowEcpmInfo 只需要在当前 adView show 之后调用, show 之前调用该方法会返回 nil)
CloooudMRitInfo *info = [model.mediation getShowEcpmInfo];
NSLog(@"ecpm:%@", info.ecpm);
NSLog(@"platform:%@", info.adnName);
NSLog(@"ritID:%@", info.slotID);
NSLog(@"requestID:%@", info.requestID ?: @"None");
*/
CloooudDictionary *mediaExt = model.mediation.extraData;
if (mediaExt) {
NSLog(@"coupon:%@", mediaExt[@"coupon"]);
NSLog(@"live_room:%@", mediaExt[@"live_room"]);
NSLog(@"product:%@", mediaExt[@"product"]);
}
// 展示广告
if (model.mediation.canvasView) {
[self.view addSubview:model.mediation.canvasView];
}
}
}
// 广告加载失败
- (void)nativeAdsManager:(CloooudNativeAdsManager *)adsManager didFailWithError:(NSError *_Nullable)error {
}
详细示例请参见Demo